//测试GGX的分布函数的像素着色器

#define PI 3.1415926

//顶点着色器输出
struct VS_OUTPUT
{
    float4 Pos : SV_POSITION;
    float3 Normal : NORMAL;
	float2 TexCoord : TEXCOORD0;
	float3 WorldPosition : TEXCOORD1;
};

TextureCube skyboxCubeMap : register( t9 );
SamplerState ourSampler : register( s5 );

cbuffer SceneData : register( b7 )
{
	matrix View;
	matrix Projection;
	float4 lightDir;
	float4 eyePosition;
	float4 TestValue;
}

float chi(float v)
{
	return v > 0 ? 1 : 0;
}
//GGX的分布函数
//a：粗糙度
//m：微面元的法线
//n：宏观表面的法线
float GGX_Distribution(float a, float3 m, float3 n)
{
	float cosTheta = dot(m, n);
	float tanTheta2 = (1.0 - pow(cosTheta, 2)) / pow(cosTheta, 2);
	return a * a * chi(dot(m, n)) /
		(PI * pow(cosTheta, 4) * pow(a * a + tanTheta2, 2));
}

float4 Main(VS_OUTPUT input) : SV_Target
{
	//测试的粗糙度
	float TestRoughness = TestValue;

	//视线方向
	float3 V = normalize(eyePosition.xyz - input.WorldPosition);

	//光线方向
	float3 L = normalize(lightDir);

	//半向量
	float3 HalfVector = normalize(L + V);

	//将“半向量”带入公式（使用半向量的原因是：法线朝向是半向量的面元会将光线反射到视线方向，借此可以模拟高光效果）
	float D = GGX_Distribution(TestRoughness, HalfVector, normalize(input.Normal));

	//输出以将概率可视化
	return float4(D, D, D, 1);
}
